home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Graphics / Ghostscript / source / dwdll.cpp < prev    next >
C/C++ Source or Header  |  1996-07-03  |  9KB  |  344 lines

  1. /* Copyright (C) 1996, Russell Lang.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19.  
  20. // dwdll.cpp
  21.  
  22. // gsdll class  for MS-Windows
  23.  
  24. #define STRICT
  25. #include <windows.h>
  26. #include <string.h>
  27. #include <stdio.h>
  28.  
  29. extern "C" {
  30. #include "gsdll.h"
  31. }
  32.  
  33. #include "dwdll.h"   // gsdll_class
  34.  
  35. static char not_loaded[] = "DLL is not loaded";
  36. static char func_null[]  = "A function pointer to the DLL is NULL";
  37. static char not_init[] = "Not initialized";
  38.  
  39. int
  40. gsdll_class::load(const HINSTANCE in_hinstance, 
  41.     const char *name, const long need_version)
  42. {
  43. char fullname[1024];
  44. const char *shortname;
  45. char *p;
  46. long version;
  47.  
  48.     // Don't load if already loaded
  49.     if (hmodule)
  50.     return 0;
  51.     hinstance = in_hinstance;
  52.     initialized = FALSE;
  53.   
  54.  
  55.     // Try to load DLL first with given path
  56.     hmodule = LoadLibrary(name);
  57.     if (hmodule < (HINSTANCE)HINSTANCE_ERROR) {
  58.     // failed
  59.     // try again, with path of EXE
  60.     if ((shortname = strrchr((char *)name, '\\')) == (const char *)NULL)
  61.         shortname = name;
  62.     GetModuleFileName(hinstance, fullname, sizeof(fullname));
  63.     if ((p = strrchr(fullname,'\\')) != (char *)NULL)
  64.         p++;
  65.     else
  66.         p = fullname;
  67.     *p = '\0';
  68.     strcat(fullname, shortname);
  69.         hmodule = LoadLibrary(fullname);
  70.         if (hmodule < (HINSTANCE)HINSTANCE_ERROR) {
  71.         // failed again
  72.         // try once more, this time on system search path
  73.             hmodule = LoadLibrary(shortname);
  74.             if (hmodule < (HINSTANCE)HINSTANCE_ERROR) {
  75.         sprintf(last_error, "Couldn't load DLL, LoadLibrary error code %d", (int)hmodule);
  76.         hmodule = (HINSTANCE)0;
  77.         return 1;
  78.         }
  79.     }
  80.     }
  81.  
  82.     // DLL is now loaded
  83.     // Get pointers to functions
  84.     c_revision = (PFN_gsdll_revision) GetProcAddress(hmodule, "gsdll_revision");
  85.     if (c_revision == NULL) {
  86.     sprintf(last_error, "Can't find gsdll_revision\n");
  87.     unload();
  88.     return 1;
  89.     }
  90.     // check DLL version
  91.     c_revision(NULL, NULL, &version, NULL);
  92.     if (version != need_version) {
  93.     sprintf(last_error, "Wrong version of DLL found.\n  Found version %ld\n  Need version  %ld\n", version, need_version);
  94.     unload();
  95.     return 1;
  96.     }
  97.  
  98.     // continue loading other functions */
  99.     c_init = (PFN_gsdll_init) GetProcAddress(hmodule, "gsdll_init");
  100.     if (c_init == NULL) {
  101.     sprintf(last_error, "Can't find gsdll_init\n");
  102.     unload();
  103.     return 1;
  104.     }
  105.     c_execute_begin = (PFN_gsdll_execute_begin) GetProcAddress(hmodule, "gsdll_execute_begin");
  106.     if (c_execute_begin == NULL) {
  107.     sprintf(last_error, "Can't find gsdll_execute_begin\n");
  108.     unload();
  109.     return 1;
  110.     }
  111.     c_execute_cont = (PFN_gsdll_execute_cont) GetProcAddress(hmodule, "gsdll_execute_cont");
  112.     if (c_execute_cont == NULL) {
  113.     sprintf(last_error, "Can't find gsdll_execute_cont\n");
  114.     unload();
  115.     return 1;
  116.     }
  117.     c_execute_end = (PFN_gsdll_execute_end) GetProcAddress(hmodule, "gsdll_execute_end");
  118.     if (c_execute_end == NULL) {
  119.     sprintf(last_error, "Can't find gsdll_execute_end\n");
  120.     unload();
  121.     return 1;
  122.     }
  123.     c_exit = (PFN_gsdll_exit) GetProcAddress(hmodule, "gsdll_exit");
  124.     if (c_exit == NULL) {
  125.     sprintf(last_error, "Can't find gsdll_exit\n");
  126.     unload();
  127.     return 1;
  128.     }
  129.     c_lock_device = (PFN_gsdll_lock_device) GetProcAddress(hmodule, "gsdll_lock_device");
  130.     if (c_lock_device == NULL) {
  131.     sprintf(last_error, "Can't find gsdll_lock_device\n");
  132.     unload();
  133.     return 1;
  134.     }
  135.     c_copy_dib = (PFN_gsdll_copy_dib) GetProcAddress(hmodule, "gsdll_copy_dib");
  136.     if (c_copy_dib == NULL) {
  137.     sprintf(last_error, "Can't find gsdll_copy_dib\n");
  138.     unload();
  139.     return 1;
  140.     }
  141.     c_copy_palette = (PFN_gsdll_copy_palette) GetProcAddress(hmodule, "gsdll_copy_palette");
  142.     if (c_copy_palette == NULL) {
  143.     sprintf(last_error, "Can't find gsdll_copy_palette\n");
  144.     unload();
  145.     return 1;
  146.     }
  147.     c_draw = (PFN_gsdll_draw) GetProcAddress(hmodule, "gsdll_draw");
  148.     if (c_draw == NULL) {
  149.     sprintf(last_error, "Can't find gsdll_draw\n");
  150.     unload();
  151.     return 1;
  152.     }
  153.     return 0;
  154. }
  155.  
  156. int
  157. gsdll_class::unload(void)
  158. {
  159.     // exit Ghostscript interpreter
  160.     if (initialized) {
  161.     if (!execute_code)
  162.         c_execute_end();
  163.     c_exit();
  164. #ifndef __WIN32__
  165.     FreeProcInstance((FARPROC)callback);
  166. #endif
  167.         callback = NULL;
  168.     }
  169.  
  170.     // Set functions to NULL to prevent use
  171.     c_revision = NULL;
  172.     c_init = NULL;
  173.     c_execute_begin = NULL;
  174.     c_execute_cont = NULL;
  175.     c_execute_end = NULL;
  176.     c_exit = NULL;
  177.     c_lock_device = NULL;
  178.     c_copy_dib = NULL;
  179.     c_copy_palette = NULL;
  180.     c_draw = NULL;
  181.  
  182.     // need to do more than this
  183.     device = NULL;
  184.  
  185.     // Don't do anything else if already unloaded
  186.     if (hmodule == (HINSTANCE)NULL)
  187.     return 0;
  188.  
  189.     FreeLibrary(hmodule);
  190.     return 0;
  191. }
  192.  
  193. int 
  194. gsdll_class::revision(char FAR * FAR *product, char FAR * FAR *copyright, 
  195.     long FAR *revision, long FAR *revisiondate)
  196. {
  197.     if (!hmodule) {
  198.     strcpy(last_error, not_loaded);
  199.     return 1;
  200.     }
  201.     if (!c_revision)
  202.     return c_revision(product, copyright, revision, revisiondate);
  203.     strcpy(last_error, func_null);
  204.     return 1;
  205. }
  206.  
  207. int 
  208. gsdll_class::init(GSDLL_CALLBACK in_callback, HWND hwnd, int argc, char FAR * FAR *argv)
  209. {
  210. int rc;
  211.     execute_code = 0;
  212.     if (!hmodule) {
  213.     strcpy(last_error, not_loaded);
  214.     return 1;
  215.     }
  216.     if (initialized) {
  217.     strcpy(last_error, "Already initialized");
  218.     return 1;
  219.     }
  220.     if (in_callback == (GSDLL_CALLBACK)NULL) {
  221.     strcpy(last_error, "Callback not provided");
  222.     return 1;
  223.     }
  224.  
  225. #ifdef __WIN32__
  226.     callback = in_callback;
  227. #else
  228.     callback = (GSDLL_CALLBACK)MakeProcInstance((FARPROC)in_callback, hinstance);
  229. #endif
  230.  
  231.     if (c_init && c_execute_begin) {
  232.     rc = c_init(callback, hwnd, argc, argv);
  233.     if (rc) {
  234.         if (rc == GSDLL_INIT_IN_USE)
  235.             sprintf(last_error, "gsdll_init returns %d\nDLL already in use", rc);
  236.         else
  237.             sprintf(last_error, "gsdll_init returns %d\n", rc);
  238.         return rc;
  239.     }
  240.     else {
  241.         if ((rc = c_execute_begin()) != 0)
  242.             sprintf(last_error, "gsdll_execute_begin returns %d", rc);
  243.         else
  244.             initialized = TRUE;
  245.         return rc;
  246.     }
  247.     }
  248.     strcpy(last_error, func_null);
  249.     return 1;
  250. }
  251.  
  252. int
  253. gsdll_class::restart(int argc, char FAR * FAR *argv)
  254. {
  255.     if (!hmodule) {
  256.     strcpy(last_error, not_loaded);
  257.     return 1;
  258.     }
  259.     if (!initialized) {
  260.     strcpy(last_error, not_init);
  261.     return 1;
  262.     }
  263.     if (c_execute_end && c_exit) {
  264.     if (!execute_code)
  265.         c_execute_end();
  266.     c_exit();
  267. #ifndef __WIN32__
  268.     FreeProcInstance((FARPROC)callback);
  269. #endif
  270.     // ignore return codes since they we may be aborting from an error
  271.     initialized = FALSE;
  272.     return init(callback, hwnd, argc, argv);
  273.     }
  274.  
  275.     strcpy(last_error, func_null);
  276.     return 1;
  277. }
  278.  
  279. int 
  280. gsdll_class::get_last_error(char *str, int len)
  281. {
  282.     strncpy(str, last_error,  
  283.     (len < sizeof(last_error) ? len : sizeof(last_error)));
  284.     return 0;
  285. }
  286.  
  287.  
  288. int 
  289. gsdll_class::execute(const char FAR *str, int len)
  290. {
  291.     if (!hmodule) {
  292.     strcpy(last_error, not_loaded);
  293.     return 1;
  294.     }
  295.     if (!initialized) {
  296.     strcpy(last_error, not_init);
  297.     return 1;
  298.     }
  299.     if (c_execute_cont) {
  300.     execute_code = c_execute_cont(str, len);
  301.     return execute_code;
  302.     }
  303.  
  304.     strcpy(last_error, func_null);
  305.     return 1;
  306. }
  307.  
  308. int 
  309. gsdll_class::draw(const char FAR *device, HDC hdc, int dx, int dy, int wx, int wy, int sx, int sy)
  310. {
  311. RECT source, dest;
  312.     source.left = sx;
  313.     source.right = sx+wx;
  314.     source.top = sy;
  315.     source.bottom = sy+wy;
  316.  
  317.     dest.left = dx;
  318.     dest.right = dx+wx;
  319.     dest.top = dy;
  320.     dest.bottom = dy+wy;
  321.     c_draw((unsigned char FAR *)device, hdc, &dest, &source);
  322.     return 0;
  323. }
  324.  
  325. HPALETTE 
  326. gsdll_class::copy_palette(const char FAR *device)
  327. {
  328.     return c_copy_palette((unsigned char FAR *)device);
  329. }
  330.  
  331.  
  332. HGLOBAL
  333. gsdll_class::copy_dib(const char FAR *device)
  334. {
  335.     return c_copy_dib((unsigned char FAR *)device);
  336. }
  337.  
  338.  
  339. int 
  340. gsdll_class::lock_device(const char FAR *device, int lock)
  341. {
  342.     return c_lock_device((unsigned char FAR *)device, lock);
  343. }
  344.